package lib.bone.admin.listener;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.extra.pinyin.PinyinUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import lib.bone.access.module.post.NepuPostService;
import lib.bone.access.module.post.domain.NepuPost;
import lib.bone.system.domain.dto.user.UserUpdateImportDTO;
import lib.bone.system.domain.entity.SysDept;
import lib.bone.system.domain.entity.SysUser;
import lib.bone.system.service.SysDeptService;
import lib.bone.system.service.SysUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;

import java.util.Optional;

@Slf4j
public class UserUpdateImportListener extends AnalysisEventListener<UserUpdateImportDTO> {

    /**
     * 用户服务
     */
    SysUserService userService;
    /**
     * 部门服务
     */
    SysDeptService deptService;

    NepuPostService nepuPostService;

    public UserUpdateImportListener(){}

    public UserUpdateImportListener(SysUserService userService, SysDeptService deptService, NepuPostService nepuPostService){
        this.userService = userService;
        this.deptService = deptService;
        this.nepuPostService = nepuPostService;
    }


    @Override
    @Transactional
    public void invoke(UserUpdateImportDTO userUpdateImportDTO, AnalysisContext analysisContext) {
        //1.查询用户是否已经存在
        Optional<SysUser> userOp = userService.findByUserName(userUpdateImportDTO.getUserName());
        //用户存在则查询用户信息是否需要被更新（1）
        if (userOp.isPresent()){
            SysUser sysUser = userOp.get();
            //2.查询用户部门信息是否存在
            Optional<SysDept> sysDeptOp = deptService.getById(sysUser.getDeptId());
            //用户部门信息存在则查询所在部门是否需要被更新（2）
            if (sysDeptOp.isPresent()){
                //3.判断用户部门信息是否发生变化
                //无变化则跳过（3）
                if (sysDeptOp.get().getDeptName().equals(userUpdateImportDTO.getDeptName())){

                }
                //有变化则绑定新的部门信息（3）
                else {
                    Optional<SysDept> sysDeptOp1 = deptService.findByDeptName(userUpdateImportDTO.getDeptName());
                    //用户部门信息不存在则绑定所在部门信息（2）
                    if (!sysDeptOp1.isPresent()){
                        log.info("{}部门不存在",userUpdateImportDTO.getDeptName());
                        return;
                    }else {
                        sysUser.setDeptId(sysDeptOp1.get().getId());
                    }

                }
            }
            if(sysUser.getPostId()!=null){
                //4.查询岗位信息
                Optional<NepuPost> postOp = nepuPostService.getById(sysUser.getPostId());
                //岗位信息存在则查询是否变化
                if (userUpdateImportDTO.getPost()!=null){
                    if (postOp.isPresent()){
                        if (postOp.get().getPostType().contains(userUpdateImportDTO.getPost())){

                        }else {
                            log.info("{}用户的岗位发生了变化！"+sysUser.getUserName());
                            if (userUpdateImportDTO.getPost().equals("管理岗")||userUpdateImportDTO.getPost().equals("高层次人才")){
                                userUpdateImportDTO.setPost("高层次人才/管理岗");
                                Optional<NepuPost> postOp1 = nepuPostService.findByName(userUpdateImportDTO.getPost());
                                sysUser.setPostId(postOp1.get().getId());
                            }

                        }
                    }
                }

            }
            if (sysUser.getPostId()==null&&userUpdateImportDTO.getPost()!=null){
                if (userUpdateImportDTO.getPost().equals("管理岗")||userUpdateImportDTO.getPost().equals("高层次人才")){
                    userUpdateImportDTO.setPost("高层次人才/管理岗");
                }
                Optional<NepuPost> postOp1 = nepuPostService.findByName(userUpdateImportDTO.getPost());
                if (postOp1.isPresent()){
                    sysUser.setPostId(postOp1.get().getId());
                    userService.updateOne(sysUser);
                }else {
                    log.info("{}岗位信息不存在!"+userUpdateImportDTO.getPost());
                }
            }

        }
        //用户不存在则新增用户（1）
        else {
            SysUser sysUser = new SysUser();
            if (userUpdateImportDTO.getPost().equals("管理岗")||userUpdateImportDTO.getPost().equals("高层次人才")){
                userUpdateImportDTO.setPost("高层次人才/管理岗");
            }
            Optional<NepuPost> postOpNew = nepuPostService.findByName(userUpdateImportDTO.getPost());
            if (postOpNew.isPresent()){
                sysUser.setPostId(postOpNew.get().getId());
            }
            BeanUtil.copyProperties(userUpdateImportDTO,sysUser, CopyOptions.create().setIgnoreNullValue(true).setIgnoreError(true));
            Optional<SysDept> sysDeptOpNew = deptService.findByDeptName(userUpdateImportDTO.getDeptName());
            if (sysDeptOpNew.isPresent()){
                sysUser.setDeptId(sysDeptOpNew.get().getId());
            }else {
                log.info("{},{}导入失败,不存在对应部门{}信息", userUpdateImportDTO.getUserName(), userUpdateImportDTO.getNickName(),userUpdateImportDTO.getDeptName());
                return;
            }
            sysUser.setStatus(1);
            sysUser.setPassword("123456");
            sysUser.setInitial(PinyinUtil.getFirstLetter(sysUser.getNickName(),"").substring(0,1));
            userService.saveOne(sysUser);
        }
        log.info("{},{}导入成功", userUpdateImportDTO.getUserName(), userUpdateImportDTO.getNickName());
    }


    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        log.info("数据导入完成");
    }
}
